home *** CD-ROM | disk | FTP | other *** search
/ Rocket Science Game Sampler / Rocket Science Game Sampler (Rocket Science Games)(1995).ISO / drivers / mpu401.inc < prev    next >
Text File  |  1995-06-18  |  6KB  |  148 lines

  1. ;████████████████████████████████████████████████████████████████████████████
  2. ;██                                                                        ██
  3. ;██   MPU401.INC                                                           ██
  4. ;██                                                                        ██
  5. ;██   IBM Audio Interface Library -- Roland MPU-401 I/O routines           ██
  6. ;██                                                                        ██
  7. ;██   Version 1.00 of 27-Sep-91: Initial version for AIL 2.0 release       ██
  8. ;██           1.10 of 21-Aug-94: Modified for use with AIL 3.0             ██
  9. ;██                                                                        ██
  10. ;██   8086 ASM source compatible with Turbo Assembler v2.0 or later        ██
  11. ;██   Author: John Miles                                                   ██
  12. ;██                                                                        ██
  13. ;████████████████████████████████████████████████████████████████████████████
  14. ;██                                                                        ██
  15. ;██  Copyright (C) 1991-1995 Miles Design, Inc.                            ██
  16. ;██                                                                        ██
  17. ;██  Miles Design, Inc.                                                    ██
  18. ;██  8301 Elander Drive                                                    ██
  19. ;██  Austin, TX 78750                                                      ██
  20. ;██                                                                        ██
  21. ;██  (512) 345-2642 / FAX (512) 338-9630 / BBS (512) 454-9990              ██
  22. ;██                                                                        ██
  23. ;████████████████████████████████████████████████████████████████████████████
  24.  
  25. DATA_IO         dw ?                    ;IO_addr
  26. STAT_COM        dw ?                    ;IO_addr+1
  27.  
  28. ;****************************************************************************
  29. set_IO_parms    PROC IO_PORT,INTR,DMA,DRQ
  30.                 USES ds,si,di
  31.  
  32.                 mov ax,[IO_PORT]
  33.                 mov DATA_IO,ax
  34.                 inc ax
  35.                 mov STAT_COM,ax
  36.  
  37.                 ret
  38.                 ENDP
  39.  
  40. ;****************************************************************************
  41. detect_device   PROC H,IO_PORT,INTR,DMA,DRQ  ;Attempt to detect MPU-401 card
  42.                 USES ds,si,di    
  43.                 pushf
  44.                 cli
  45.  
  46.                 push DATA_IO              ;preserve current I/O address
  47.                 push STAT_COM
  48.  
  49.                 call set_IO_parms C,[IO_PORT],[INTR],[DMA],[DRQ]
  50.  
  51.                 call reset_interface      ;attempt to reset card
  52.  
  53.                 pop STAT_COM
  54.                 pop DATA_IO
  55.  
  56.                 POP_F                     ;return AX=0 if not found
  57.                 ret
  58.                 ENDP
  59.  
  60. ;****************************************************************************
  61. send_byte       PROC DataByte:BYTE
  62.  
  63.                 mov dx,STAT_COM
  64. __wait_cts:     in al,dx
  65.                 test al,40h
  66.                 je __write_it
  67.                 test al,80h
  68.                 jne __wait_cts
  69.                 sti                     ;if MIDI byte incoming, give receiving
  70.                 jmp $+2                 ;process a chance to catch it ...
  71.                 jmp $+2                 ;prevents lost data and/or hangups
  72.                 jmp $+2                 ;during Cakewalk and MIDIECHO
  73.                 mov dx,DATA_IO
  74.                 in al,dx
  75.                 mov dx,STAT_COM
  76.                 jmp __wait_cts
  77.  
  78. __write_it:     mov dx,DATA_IO
  79.                 mov al,[DataByte]
  80.                 out dx,al
  81.  
  82.                 ret
  83.                 ENDP
  84.  
  85. ;****************************************************************************
  86. send_cmd        PROC CmdByte:BYTE
  87.  
  88.                 pushf
  89.                 cli
  90.                 mov dx,STAT_COM
  91.                 mov cx,-1
  92. __wait_cts_1:   in al,dx
  93.                 test al,40h
  94.                 jz __cts_1
  95.                 loop __wait_cts_1
  96.                 jmp __exit_bad
  97.  
  98. __cts_1:        mov al,[CmdByte]
  99.                 out dx,al
  100.  
  101.                 mov cx,-1
  102. __wait_ack:     mov dx,STAT_COM
  103.                 in al,dx
  104.                 test al,80h
  105.                 jnz __next_loop
  106.                 mov dx,DATA_IO
  107.                 in al,dx
  108.                 cmp al,0feh
  109.                 je __exit_OK
  110. __next_loop:    loop __wait_ack
  111.  
  112. __exit_bad:     mov ax,0
  113.                 jmp __exit
  114. __exit_OK:      mov ax,1
  115. __exit:         POP_F
  116.                 ret
  117.                 ENDP
  118.  
  119. ;****************************************************************************
  120. reset_interface PROC                    ;Returns 1 if MPU interface available
  121.                 USES ds,si,di
  122.                 pushf                   ;don't allow interruption
  123.                 cli
  124.  
  125.                 call send_cmd C,0ffh    ;reset MPU-401 interface
  126.                 or ax,ax
  127.                 jne __exit_reset        ;(worked the first time)
  128.  
  129.                 call send_cmd C,0ffh    ;try again in case UART mode active
  130.  
  131. __exit_reset:   POP_F
  132.                 ret
  133.                 ENDP
  134.  
  135. ;****************************************************************************
  136. init_interface  PROC                    ;Init MPU-401-compatible interface
  137.                 USES ds,si,di
  138.                 pushf                   ;don't allow interruption
  139.                 cli
  140.  
  141.                 call send_cmd C,03fh    ;assert UART mode
  142.  
  143.                 POP_F
  144.                 ret
  145.  
  146. ;****************************************************************************
  147.                 ENDP
  148.